perm filename PUP[1,DBL] blob sn#058701 filedate 1973-08-16 generic text, type T, neo UTF8
(FILECREATED "16-AUG-73 13:46:35" PUP)


(DEFINEQ

(PURE
  [QLAMBDA (TUPLE (TUPLE ←A
                         ←←B)←←C)
           (QIF (QEQUAL $A COMMENT)
             ELSE (PRINT (TUPLE $A $$B)))
           (QIF (QEQUAL $C (TUPLE))
             ELSE (PURE (TUPLE $$C])

(RAMIFICATIONS
  [QLAMBDA
    (TUPLE ←A
           ←B)
    (QPROG (←L
             ←NEXT
             ←S1
             ←S2
             ←S3)
           (QMATCHQ ←L
                    (QINSTANCES ←←ANY))
           B1
           (QATTEMPT (QMATCHQ (CLASS ←NEXT
                                     ←←L)
                              $L)
             ELSE (QRETURN TRUE))
           B2
           [QATTEMPT (QMATCHQ (TUPLE ←←S1
                                     $A ←←S2
                                     $B ←←S3)
                              $NEXT)
               THEN (QPROG NIL (QDELETE (TUPLE $$S1 $A $$S2 $B $$S3))
                           (QASSERT (TUPLE $$S1 $B $$S2 $A $$S3))
                           (GOTO B3))
             ELSE (QATTEMPT (QMATCHQ (TUPLE ←←S1
                                            $B ←←S2
                                            $A ←←S3)
                                     $NEXT)
                      THEN (QPROG NIL
                                  (QDELETE (TUPLE $$S1 $B $$S2 $A $$S3))
                                  (QASSERT (TUPLE $$S1 $A $$S2 $B $$S3))
                                  (GOTO B3))
                    ELSE (QATTEMPT (QMATCHQ (TUPLE ←←S1
                                                   $A ←←S2)
                                            $NEXT)
                             THEN (QPROG NIL
                                         (QDELETE (TUPLE $$S1 $A $$S2))
                                         (QASSERT (TUPLE $$S1 $B $$S2))
                                         (GOTO B3))
                           ELSE (QATTEMPT (QMATCHQ (TUPLE ←←S1
                                                          $B ←←S2)
                                                   $NEXT)
                                    THEN (QPROG NIL
                                                (QDELETE (TUPLE $$S1 $B 
                                                               $$S2))
                                                (QASSERT (TUPLE $$S1 $A 
                                                               $$S2]
           B3
           (QATTEMPT (QMATCHQ (TUPLE ←←S1
                                     (TUPLE ←←NEXT)←←S2)
                              $NEXT)
               THEN (GOTO B2)
             ELSE (GOTO B1])

(OUTTUPLE
  [LAMBDA (S)
    (COND
      ((ATOM S)
        S)
      ((EQUAL (CAR S)
              (QUOTE TUPLE))
        (OUTTUPLE (CDR S)))
      (T (CONS (OUTTUPLE (CAR S))
               (OUTTUPLE (CDR S])

(EXECUTE
  [LAMBDA (I)
    [EVAL (LIST (QUOTE DEFINEQ)
                (LIST $NAME (APPEND (LIST (QUOTE LAMBDA)
                                          (LIST $L)
                                          (LIST (QUOTE SETQ)
                                                (QUOTE EX)
                                                $L))
                                    I]
    (($NAME (EVAL EX])

(LISPTRANSLATE
  [QLAMBDA ←E
           (EVAL (CDR (SASSOC $E
                              (QUOTE (((TUPLE FIRST ELEMENT)
                                       TUPLE CAR $L)
                                      ((TUPLE LAST ELEMENT)
                                       TUPLE LAST $L)
                                      ((TUPLE SECOND ELEMENT)
                                       TUPLE CADR $L)
                                      ((TUPLE ALL BUT THE FIRST ELEMENT)
                                       TUPLE CDR $L)
                                      ((TUPLE ALL BUT THE FIRST TWO 
                                                           ELEMENTS)
                                       TUPLE CDDR $L)
                                      ((TUPLE ALL BUT THE SECOND 
                                              ELEMENT)
                                       TUPLE CONS (TUPLE CAR $L)
                                       (TUPLE CDDR $L))
                                      ((TUPLE ALL BUT THE SINGLETON 
                                              LIST OF THE FIRST ELEMENT)
                                       TUPLE CDR $L)
                                      ((TUPLE ALL BUT THE CLOSEST 
                                              ELEMENT
                                          TO A)
                                       TUPLE PULLOUT
                                       (TUPLE EXTREMORD1 $L $RELNN)
                                       $L)
                                      ((TUPLE ALL BUT THE SMALLEST 
                                              ELEMENT)
                                       TUPLE PULLOUT
                                       (TUPLE EXTREMORD1 $L $RELNN)
                                       $L)
                                      ((TUPLE SMALLEST ELEMENT)
                                       TUPLE EXTREMORD1 $L $RELNN)
                                      ((TUPLE CLOSEST ELEMENT
                                          TO A)
                                       TUPLE EXTREMORD1 $L $RELNN)
                                      ((TUPLE SINGLETON LIST OF THE 
                                              LAST ELEMENT)
                                       TUPLE LIST (TUPLE LAST $L))
                                      ((TUPLE SINGLETON LIST OF THE
                                          FIRST ELEMENT)
                                       TUPLE LIST (TUPLE CAR $L))
                                      ($E. (PRINT (TUPLE COMMENT SORRY 
                                                         I CANNOT 
                                                         TRANSLATE $E])

(REV2ELS
  (QLAMBDA (TUPLE ←RELN
                  ←A
                  ←B)
           (QIF (QAND (QEQUAL (QGET $RELN PARTIAL)
                              TRUE)
                      (QEQUAL (QGET $RELN ANTISYM)
                              TRUE))
             ELSE (QFAIL))
           (QATTEMPT (QEXISTS (TUPLE $RELN $B $A))
             ELSE (TRANSITIVECLOSURE (TUPLE $RELN $B $A)))
           (QEXISTS (TUPLE C $A ←ACON))
           (QEXISTS (TUPLE C $B ←BCON))
           (QGOAL (TUPLE SERIES (TUPLE C $A $BCON)
                         (TUPLE C $B $ACON))
                  APPLY $GOALTYPE)))

(CELLEQUAL
  (QLAMBDA (CLASS ←A
                  ←B)
           (QAND (QATTEMPT (QEXISTS (TUPLE C $A ←VAL1)))
                 (QATTEMPT (QEXISTS (TUPLE C $B ←VAL2)))
                 (QMATCHQ $VAL1 $VAL2))))

(LISTEQUAL
  [QLAMBDA (CLASS ←A
                  ←B)
           (QPROG (←E1
                    ←E2
                    ←E3
                    ←E4)
                  (QATTEMPT (QMATCHQ (TUPLE ←E1
                                            ←←E2)
                                     $A)
                      THEN (QMATCHQ (TUPLE ←E3
                                           ←←E4)
                                    $B)
                    ELSE (QATTEMPT (QMATCHQ (TUPLE ←E3
                                                   ←←E4)
                                            $B)
                             THEN (QRETURN FALSE)
                           ELSE (QRETURN TRUE)))
                  (QIF (QAND (CELLEQUAL (CLASS $E1 $E3))
                             (LISTEQUAL (CLASS $E2 $E4)))
                      THEN (QRETURN TRUE)
                    ELSE (QRETURN FALSE])

(PULLOUT
  [LAMBDA (E L)
    (COND
      ((EQUAL E (CAR L))
        (CDR L))
      (T (CONS (CAR L)
               (PULLOUT E (CDR L])

(NUMERORDER
  [LAMBDA (A B)
    (ALPHORDER A B])

(EXTREMORD
  (QLAMBDA (TUPLE ←L
                  ←RELNN)
           (QATTEMPT (QMATCHQ (TUPLE ←X
                                     ←Y
                                     ←←Z)
                              $L)
               THEN (IF ($RELNN $X $Y)
                        THEN (EXTREMORD (TUPLE (TUPLE $X $$Z)
                                               $RELNN))
                      ELSE (EXTREMORD (TUPLE (TUPLE $Y $$Z)
                                             $RELNN)))
             ELSE (CDR $L))))

(ORDERING
  (QLAMBDA ←L
           (QMATCHQ ←S
                    (TUPLE IDENTITY))
           (QMATCHQ ←E1
                    (TUPLE FIRST ELEMENT))
           (QMATCHQ ←E2
                    (EXTREMEORDERING $RELNN))
           (PRINT (TUPLE
                     IN PARTICULAR THE $$E1 OF THE NEW LIST $L IS THE 
                        $$E2 OF THE
                     OLD LIST $L))
           (QMATCHQ ←RECBODY
                    (POSITIONALJOIN (TUPLE $E2 (ALLBUT $E2)
                                           $E1)))
           (PRINT (QUOTE (THIS ENABLED US TO GET THE RECURSIVE BODY)))
           (PRINT $RECBODY)
           (PRINT (QUOTE (WE NOW DETERMINE THE TERMINATION STEPS)))
           (QMATCHQ ←NEWFUNC
                    (RECHEAD $RECBODY))
           (EVAL (PRINT $NEWFUNC))
           (QMATCHQ ←PGM
                    (TUPLE $NEWFUNC $$PGM))))

(EXTREMEORDERING
  (QLAMBDA ←RELN
           (QGET (TUPLE RELN $RELN)
                 EXTREME)))

(NEWCDR
  [LAMBDA (L)
    (COND
      (L (CDR L))
      (T (RETFROM (QUOTE EXECUTE)
                  (QUOTE ((BREAKING OUT OF NEWCDR])

(REASONTOGET
  [QLAMBDA ←A
           (IF (AND (ZEROP (LENGTH $SET))
                    (QMATCHQ ←SET
                             (EVAL $SET)))
               THEN (AND (QMATCHQ (TUPLE ←FUNC)
                                  $A)
                         ($FUNC $SET))
             ELSE (AND (PRINT (TUPLE SORRY CANNOT GET $$A OF $SET))
                       (QFAIL])

(FINITE
  (QLAMBDA ←SET
           (EQUAL (QGET $SET FINITE)
                  T)))

(UPPERBOUND
  (QLAMBDA ←SET
           (COND
             ((FINITE $SET)
               (EXTREMORD (TUPLE $SET NUMERORDER)))
             ((QATTEMPT (QMATCHQ (TUPLE THE NEGATIVE ←←ANY)
                                 $SET))
               -1)
             ((QATTEMPT (QMATCHQ (TUPLE THE NONPOSITIVE ←←ANY)
                                 $SET))
               0)
             ((REASONTOGET (TUPLE UPPERBOUND)))
             (T NIL))))

(MONOTONEIN
  [QLAMBDA (TUPLE ←FUNC
                  ←VAR)
           (QPROG NIL (IF (OR (EQUAL $FUNC $VAR)
                              (EQUAL $FUNC $X)
                              (QGET (TUPLE RELN $FUNC)
                                    MONOTONE))
                          THEN (RETURN T))
                  (QMATCHQ (TUPLE ←F1
                                  ←←F)
                           $FUNC)
                  (RETURN (AND (MONOTONEIN (TUPLE (TUPLE $F1)
                                                  $VAR))
                               (MONOTONEIN (TUPLE $F2 $VAR])

(NEGATION
  [QLAMBDA ←EXPRES
           (QBEXISTS (TUPLE RELN ←REL)
               THEN (PROGN (QMATCHQ ←NEWREL
                                    (QGET (TUPLE RELN $REL)
                                          NEGATION))
                           (QMATCHQ (TUPLE ←←A1
                                           $REL ←←A2)
                                    $EXPRES)
                           (TUPLE $$A1 ?NEWREL $$A2])

(PREVERSE
  (QLAMBDA (TUPLE ←←P)
           (QPROG NIL (QMATCHQ ←PCOP
                               (TUPLE))
                  LOOP
                  (QATTEMPT (QMATCHQ (TUPLE ←P1
                                            ←←P)
                                     $P)
                    ELSE (RETURN $PCOP))
                  (QMATCHQ ←PCOP
                           (TUPLE $P1 $$PCOP))
                  (GO LOOP))))

(SQUARE
  [LAMBDA (A)
    (TIMES A A])

(REPLACE
  [QLAMBDA (TUPLE ←OLD
                  ←NEW
                  INEXPRESSION ←EXP)
           (QATTEMPT (QMATCHQ (TUPLE ←←A1
                                     $OLD ←←A2)
                              $EXP)
               THEN (TUPLE $$A1 $NEW $$A2)
             ELSE (QATTEMPT (QMATCHQ (TUPLE ←←A1
                                            (TUPLE ←←A2
                                                   $OLD ←←A3)←←A4)
                                     $EXP)
                      THEN (TUPLE $$A1 (TUPLE $$A2 $NEW $$A3)
                                  $$A4)
                    ELSE (AND (PRINT (TUPLE SORRY
                                        IF $EXP CONTAINS $OLD IT IS
                                        IN TOO DEEPLY
                                        FOR ME
                                        TO SEE IT)
                                     $EXP])

(NOTENEWFORM
  (QLAMBDA ←ANY
           (PRINT (TUPLE OUR PROBLEM $DESC IS SIMPLIFIED INTO $NEWDESC 
                         WHICH IS JUSTIFIED SINCE $CONDITION IS TRUE))
           (QMATCHQ ←PGM
                    (TUPLE (TUPLE COMMENT PROBLEM $DESC IS SIMPLIFIED 
                                  INTO $NEWDESC BY JUSTIFICATION 
                                                   $CONDITION)
                           $$PGM))
           $ANY))

(RECURNUM
  [QLAMBDA (TUPLE ←NAME
                  ←ARG)
           (IF (NUMBERP $ARG)
             ELSE (QFAIL))
           (QATTEMPT (QEXISTS (TUPLE RELN $NAME)
                              TYPE NUM KNOWN T)
               THEN (IF (QGET (TUPLE RELN $NAME)
                              COMPUTABLE)
                        THEN ($NAME $ARG)
                      ELSE (NEWRECURNUM (TUPLE $NAME $ARG)))
             ELSE (NEWRECURNUM (TUPLE $NAME $ARG])

(NEWRECURNUM
  [QLAMBDA
    (TUPLE ←NAME
           ←ARG)
    (QPROG NIL
           (PRINT (TUPLE WE ARE DEFINING A FUNCTION $NAME WHICH IS 
                         NUMERIC
                     IN CHARACTER, SO PLEASE DESCRIBE THE DOMAIN
                          AND RANGE:))
           (PRINT (QUOTE "DOMAIN...."))
           (SETQ LDOMAIN (CONS (RATOM)
                               (READLINE)))
           (QMATCHQ ←DOMAIN
                    (TUPLE (EVAL LDOMAIN)))
           (QMATCHQ (TUPLE ←DOMAIN
                           ←←ANY)
                    $DOMAIN)
           (PRIN1 (QUOTE "RANGE ..."))
           (SETQ LRANGE (CONS (RATOM)
                              (READLINE)))
           (QMATCHQ (TUPLE ←RANGE
                           ←←ANY)
                    (TUPLE (EVAL LRANGE)))
           (QMATCHQ (CLASS ←X
                           ←←UNUSEDARGS)
                    $UNUSEDARGS)
           READESC
           (PRINT (TUPLE SUPPOSE Y =(TUPLE $NAME $X)))
           (PRINT (TUPLE DESCRIBE Y IN TERMS OF $X))
           (SETQ LDESC (CONS (RATOM)
                             (READLINE)))
           (QMATCHQ (TUPLE ←DESC
                           ←←ANYTHING)
                    (TUPLE (EVAL LDESC)))
           (PRINT (TUPLE DESCRIPTION IS $DESC RANGE IS $RANGE DOMAIN IS 
                         $DOMAIN))
           (QASSERT (TUPLE RELN $NAME)
                    TYPE NUM DOMAIN $DOMAIN RANGE $RANGE KNOWN T FACTS
                    (TUPLE $DESC)
                    COMPUTABLE T DEFINITION NIL)
           (QMATCHQ (TUPLE ←RELN1
                           ←ARG1
                           ←CONNECTIVE
                           ←GOAL)
                    $DESC)
           (PRINT (TUPLE RELN1 IS $RELN1 ARG1 IS $ARG1 CONNECTIVE IS 
                         $CONNECTIVE GOAL IS $GOAL A1 A2 ARE ?A1 ?A2))
           (QMATCHQ ←PGM
                    (TUPLE (TUPLE COMMENT OUR GOAL IS CURRENTLY $GOAL)
                           $$PGM))
           GETPLAN
           (QMATCHQ ←GOAL
                    (MAKECOMPUTABLE $GOAL))
           (QMATCHQ ←PGM
                    (TUPLE (TUPLE COMMENT OUR GOAL IS CURRENTLY $GOAL)
                           $$PGM))
           (QMATCHQ ←DESC
                    (TUPLE $RELN1 $ARG1 $CONNECTIVE $GOAL))
           [QATTEMPT (EVAL (QGET (TUPLE RELN $RELN1)
                                 COMPUTABLE))
               THEN (RETURN (OPTIMIZE
                              (TUPLE $NAME (IMPLEMENT
                                       (QGET (TUPLE RELN $RELN1)
                                             DEFINITION]
           (QMATCHQ ←TEMP
                    (QGET (TUPLE RELN $RELN1)
                          FACTS))
           (QMATCHQ (TUPLE ←←A1
                           (TUPLE ←OLD1
                                  BECOMES ←NEW1 IF ←CONDIT1)←←A2)
                    $TEMP)
           (QMATCHQ ←OLD
                    (EVAL $OLD1))
           (QMATCHQ ←NEW
                    (EVAL $NEW1))
           (QMATCHQ ←CONDIT
                    (EVAL $CONDIT1))
           (QMATCHQ (TUPLE $DESC BECOMES ←NEWDESC IF ←CONDITION)
                    (TUPLE $OLD BECOMES $NEW IF $CONDIT))
           (PRINT (TUPLE WE GET THE NEW DESCRIPTION OF OUR TASK
                     TO BE $NEWDESC))
           (QMATCHQ (TUPLE ←RELN1
                           ←ARG1
                           ←CONNECTIVE
                           ←GOAL)
                    $NEWDESC)
           (PRINT (TUPLE RELN IS NOW $RELN1 ARG IS NOW $ARG1 CONNECTIVE 
                         IS NOW $CONNECTIVE GOAL IS NOW $GOAL))
           (IF (HOLDS $CONDITION)
               THEN (AND (NOTENEWFORM)
                         (QMATCHQ ←DESC
                                  $NEWDESC)
                         (GO GETPLAN))
             ELSE (GO READESC])

(NEWCAR
  [LAMBDA (L)
    (COND
      (L (CAR L))
      (T (RETFROM (QUOTE EXECUTE)
                  (QUOTE (BREAKING OUT OF NEWCAR])

(NEWCARCDR
  [LAMBDA (L)
    (COND
      ((NULL L)
        NIL)
      [(EQUAL (CAR L)
              (QUOTE CDDR))
        (CONS (QUOTE NEWCDR)
              (LIST (CONS (QUOTE NEWCDR)
                          (NEWCARCDR (CDR L]
      (T (CONS [COND
                 [(ATOM (CAR L))
                   (COND
                     ((EQUAL (CAR L)
                             (QUOTE CAR))
                       (QUOTE NEWCAR))
                     ((EQUAL (CAR L)
                             (QUOTE CDR))
                       (QUOTE NEWCDR))
                     (T (CAR L]
                 (T (NEWCARCDR (CAR L]
               (NEWCARCDR (CDR L])

(ASKABOUTALL
  (QLAMBDA (CLASS ←A
                  ←←ALLTHEREST)
           (ASKABOUT $A)
           (QATTEMPT (QMATCHQ (CLASS)
                              $ALLTHEREST)
               THEN [QMATCHQ ←AALH
                             (TUPLE (TUPLE COND $$TERM (TUPLE T $BODY]
             ELSE (ASKABOUTALL $ALLTHEREST))))

(NONEOF
  [QLAMBDA (CLASS NONEOF ←Z)
           (COND
             ((EQUAL $Z (CLASS))
               T)
             (T (QMATCHQ (CLASS ←Z1
                                ←←REST)
                         $Z)
                (AND (NOT (QEXISTS $Z1))
                     (QGOAL (CLASS NONEOF $$REST)
                            APPLY $GOALTYPE])

(INVOLVES
  (QLAMBDA (TUPLE ←T1
                  ←T2)
           (SUBLISTC (FLATTEN $T1)
                     (FLATTEN $T2))))

(FLATTEN
  [LAMBDA (L)
    (COND
      ((ATOM L)
        (LIST L))
      (T (APPEND (FLATTEN (CAR L))
                 (FLATTEN (CDR L])

(INSIDEC
  [LAMBDA (E L)
    (COND
      ((NULL L)
        NIL)
      ((EQUAL E (CAR L))
        T)
      ((AND (LISTP (CAR L))
            (INSIDEC E (CAR L)))
        T)
      (T (INSIDEC E (CDR L])

(SUBLISTC
  [LAMBDA (L1 L2)
    (COND
      ((NULL L1)
        T)
      ((NULL L2)
        NIL)
      ((INSIDEC (CAR L1)
                L2)
        (SUBLISTC (CDR L1)
                  L2])

(APPENDC
  (QLAMBDA (TUPLE ←FRONTLIST
                  ←OLDLIST)
           (QMATCHQ ←PGM
                    (TUPLE (TUPLE COMMENT WE JUST TOOK LIST $FRONTLIST
                                    AND APPENDED IT ONTO FRONT OF LIST 
                                        $OLDLIST)
                           (TUPLE SETQ $OLDLIST (TUPLE APPEND 
                                                       $FRONTLIST 
                                                       $OLDLIST))
                           $$PGM))))

(REPLACECDR
  (QLAMBDA (TUPLE LIST ←L
                  ←NEWCDR
                  ←OLDCDR
                  ←CAR)
           (QDELETE (TUPLE LIST $L (TUPLE $CAR $$OLDCDR)))
           (QASSERT (TUPLE LIST $L (TUPLE $CAR $$NEWCDR)))
           (QMATCHQ ←PGM
                    (TUPLE (TUPLE COMMENT WE REPLACE CDR OF LIST $L 
                                  WHICH WAS $OLDCDR BY $NEWCDR)
                           (TUPLE RPLACD $NEWCDR $L)
                           $$PGM))))

(REPLACECAR
  (QLAMBDA (TUPLE LIST ←L
                  ←NEWCAR
                  ←OLDCAR
                  ←CDR)
           (QMATCHQ ←NEWLIST
                    (TUPLE $NEWCAR $$CDR))
           (QMATCHQ ←OLDLIST
                    (TUPLE $OLDCAR $$CDR))
           (QDELETE (TUPLE LIST $L $OLDLIST))
           (QASSERT (TUPLE LIST $L $NEWLIST))
           (QMATCHQ ←PGM
                    (TUPLE (TUPLE COMMENT WE REPLACE CAR OF LIST $L 
                                  WHICH WAS $OLDCAR
                              BY THE CELL $NEWCAR)
                           (TUPLE RPLACA $NEWCAR $L)
                           $$PGM))))

(MAKENULL
  (QLAMBDA (TUPLE LIST ←L
                  (TUPLE))
           (QATTEMPT (QEXISTS (TUPLE LIST $L ←ANY))
               THEN (QDELETE (TUPLE LIST $L $ANY)))
           (QASSERT (TUPLE LIST $L (TUPLE)))
           (QMATCHQ ←PGM
                    (TUPLE (TUPLE COMMENT WE SET LIST $L TO NULL)
                           (TUPLE SETQ $L NIL)
                           $$PGM))))

(RPLAC
  [QLAMBDA (TUPLE LIST ←L
                  (TUPLE ←CAR
                         ←←CDR))
           (QEXISTS (TUPLE LIST $L (TUPLE ←←CURRENT)))
           (QMATCHQ (TUPLE ←CURCAR
                           ←←CURCDR)
                    $CURRENT)
           (QIF (LISTEQUAL (CLASS $CURCDR $CDR))
               THEN (REPLACECAR (TUPLE LIST $L $CAR $CURCAR $CDR))
             ELSE (QIF (CELLEQUAL (CLASS $CURCAR $CAR))
                      THEN (REPLACECDR (TUPLE LIST $L $CDR $CURCDR $CAR)
                                       )
                    ELSE (QFAIL])

(NEWCELL
  [QLAMBDA (TUPLE ←VAL
                  ←LOC)
           (QPROG (←AUXLOC)
                  (QMATCHQ (CLASS ←AUXLOC
                                  ←←UNUSEDVARS)
                           $UNUSEDVARS)
                  (QASSERT (TUPLE C $AUXLOC $VAL))
                  (QMATCHQ ←PGM
                           (TUPLE (TUPLE COMMENT I MAY NEED $VAL LATER 
                                         SO BEFORE I STORE SOMETHING
                                     IN LOCATION $LOC I AM TRANSFERRING 
                                        $VAL
                                     TO THE NEWLY CREATED LOCATION 
                                        $AUXLOC)
                                  (TUPLE SETQ $AUXLOC $LOC)
                                  $$PGM])

(ALLBUT
  [QLAMBDA ←E
           (QATTEMPT (QMATCHQ $S (TUPLE IDENTITY))
               THEN (TUPLE ALL BUT THE $$E)
             ELSE (QATTEMPT (QMATCHQ $S DOUBLEFN)
                      THEN (AND (QMATCHQ (TUPLE ←←ANY
                                                ELEMENT)
                                         $E)
                                (TUPLE ALL BUT THE $$ANY TWO ELEMENTS))
                    ELSE (AND (PRINT (QUOTE (SORRY BUT I CANNOT HANDLE 
                                                   SCHEMA $S YET)))
                              (QFAIL])

(STORECVALUE
  [QLAMBDA ←LOC
           (QPROG (←VALU
                    ←RESERVE)
                  (QATTEMPT (QEXISTS (TUPLE C $LOC ←VALU))
                      THEN (QATTEMPT (QBEXISTS
                                       (TUPLE C ←RESERVE
                                              $VALU)
                                         THEN
                                          (QIF (QEQUAL $RESERVE $LOC)
                                              THEN (QFAIL)
                                            ELSE (QPUT (TUPLE C 
                                                           $RESERVE 
                                                              $VALU)
                                                       NEEDED TRUE)))
                             ELSE (NEWCELL (TUPLE $VALU $LOC)))
                    ELSE (QRETURN TRUE])

(CONSC
  [QLAMBDA
    (TUPLE LIST ←L
           (TUPLE ←CAR
                  ←←CDR))
    (QPROG
      (←M
        ←S1
        ←S2)
      (QATTEMPT (QGOAL (TUPLE LIST $L $CDR)
                       APPLY $GOALTYPE)
          THEN (QATTEMPT
                 (QEXISTS (TUPLE LIST ←M
                                 (TUPLE ←←S1
                                        $CAR ←←S2)))
                   THEN [QPROG (←M2
                                 ←T)
                               (QMATCHQ ←T
                                        (GETNEWLOCNAME))
                               (QDELETE (TUPLE LIST $L $CDR))
                               (QMATCHQ ←M2
                                        (TUPLE $T $$CDR))
                               (QASSERT (TUPLE LIST $L $M2))
                               (QMATCHQ ←PGM
                                        (TUPLE (TUPLE COMMENT WE JUST 
                                                      TOOK THE NEW CELL 
                                                      $T
                                                        AND CONSED IT 
                                                            ONTO $L 
                                                            SINCE $CAR 
                                                            ALREADY 
                                                            BELONGS
                                                  TO ANOTHER LIST 
                                                     STRUCTURE NAMELY 
                                                     $M)
                                               (TUPLE SETQ $T $CAR)
                                               (TUPLE SETQ L
                                                      (TUPLE CONS $T $L)
                                                      )
                                               $$PGM))
                               (QATTEMPT (QEXISTS (TUPLE C $CAR ←M2))
                                   THEN (QASSERT (TUPLE C $T $M2]
                 ELSE (QPROG (←TEMP)
                             (QDELETE (TUPLE LIST $L $CDR))
                             (QMATCHQ ←TEMP
                                      (TUPLE $CAR $$CDR))
                             (QASSERT (TUPLE LIST $L $TEMP))
                             (QATTEMPT
                               (QEXISTS (TUPLE LIST $CAR ←←ANYTHING))
                                 THEN (APPENDC (TUPLE $CAR $L))
                               ELSE (QMATCHQ
                                      ←PGM
                                      (TUPLE (TUPLE COMMENT WE JUST 
                                                    TOOK $CAR
                                                      AND CONSED IT 
                                                          ONTO LIST $L)
                                             (TUPLE SETQ $L
                                                    (TUPLE CONS $CAR $L)
                                                    )
                                             $$PGM])

(SETQC
  [QLAMBDA (TUPLE C ←NEWLOC
                  ←NEWVAL)
           (QPROG (←OLDLOC
                    ←LOC2
                    ←V)
                  [QATTEMPT (QEXISTS (TUPLE C ←OLDLOC
                                            $NEWVAL))
                    ELSE (QPROG NIL
                                (QMATCHQ (TUPLE ←←A
                                                (TUPLE COMMENT ←VOLD
                                                       NO LONGER HAS 
                                                       THE VALUE 
                                                       $NEWVAL)
                                                (TUPLE ←←B)
                                                (TUPLE ←←C)←←D)
                                         $PGM)
                                (QMATCHQ (CLASS ←OLDLOC
                                                ←←UNUSEDVARS)
                                         $UNUSEDVARS)
                                (QASSERT (TUPLE C $OLDLOC $NEWVAL))
                                (QMATCHQ ←PGM
                                         (TUPLE $$A
                                                (TUPLE COMMENT $VOLD NO 
                                                       LONGER HAS THE 
                                                       VALUE $NEWVAL 
                                                       BUT SINCE WE 
                                                       WILL BE NEEDING 
                                                       IT LATER WE 
                                                       STORED $NEWVAL
                                                   IN THE NEW 
                                                      AUXILLIARY CELL 
                                                      $OLDLOC)
                                                (TUPLE $$B)
                                                (TUPLE $$C)
                                                (TUPLE SETQ $OLDLOC 
                                                       $VOLD)
                                                $$D]
                  (QATTEMPT (QEXISTS (TUPLE C ←LOC2
                                            $NEWVAL)
                                     NEEDED TRUE)
                    ELSE (QPUT (TUPLE C $OLDLOC $NEWVAL)
                               NEEDED TRUE))
                  (BUILDPGM (TUPLE $NEWLOC $NEWVAL $OLDLOC))
                  (QDELETE (TUPLE C $NEWLOC ←V))
                  (QASSERT (TUPLE C $NEWLOC $NEWVAL])

(TRANSITIVECLOSURE
  [QLAMBDA (TUPLE ←RELN
                  ←A
                  ←B)
           (QIF (QEQUAL (QGET (TUPLE $RELN TRANSITIVE))
                        TRUE)
             ELSE (QFAIL))
           (QBEXISTS (TUPLE $RELN $A ←ANY)
               THEN (QIF (QEQUAL $ANY $B)
                        THEN (QASSERT (TUPLE $RELN $A $B))
                      ELSE (TRANSITIVECLOSURE (TUPLE $RELN $ANY $B])

(TRYANYTHINGANTISYMPARTIAL
  (QLAMBDA (TUPLE ←TYPE
                  ←←STUFF
                  (TUPLE ←RELN
                         ←A
                         ←B)←←STUFF2)
           (QIF (QAND (QGET $RELN ANTISYM)
                      (QGET $RELN PARTIAL))
             ELSE (QFAIL))
           (QIF (QOR (QATTEMPT (QEXISTS (TUPLE $RELN $A $B))
                         THEN (QNOTEQUAL (QGET (TUPLE $RELN $A $B)
                                               TEMP)
                                         TRUE))
                     (QATTEMPT (QEXISTS (TUPLE $RELN $B $A))
                         THEN (QNOTEQUAL (QGET (TUPLE $RELN $B $A)
                                               TEMP)
                                         TRUE)))
               THEN (QFAIL))
           (QMATCHQ ←PGM
                    (TUPLE (TUPLE COMMENT IF $A $RELN $B
                                             THEN)
                           (TUPLE COND (TUPLE $RELN $A $B))
                           $$PGM))
           (QASSERT (TUPLE $RELN $A $B))
           (QPUT (TUPLE $RELN $A $B)
                 TEMP TRUE)
           (QATTEMPT (QGOAL (TUPLE $TYPE $$STUFF (TUPLE $RELN $A $B)
                                   $$STUFF2)
                            APPLY $GOALTYPE)
             ELSE (QMATCHQ ←PGM
                           (TUPLE (TUPLE PRINT GIVEUP)
                                  $$PGM)))
           (QMATCHQ ←PGM
                    (TUPLE (TUPLE COMMENT END OF THE
                               THEN PART OF THE COND
                                      AND THUS BEGIN THE
                             ELSE PART OF THE COND)
                           (TUPLE (TUPLE T))
                           $$PGM))
           (QDELETE (TUPLE $RELN $A $B))
           (QASSERT (TUPLE $RELN $B $A))
           (QPUT (TUPLE $RELN $B $A)
                 TEMP TRUE)
           (QATTEMPT (QGOAL (TUPLE $TYPE $$STUFF (TUPLE $RELN $A $B)
                                   $$STUFF2)
                            APPLY $GOALTYPE)
             ELSE (QMATCHQ ←PGM
                           (TUPLE (TUPLE PRINT GIVEUP)
                                  $$PGM)))
           (QMATCHQ ←PGM
                    (TUPLE (TUPLE COMMENT END OF COND EXPRESSION)
                           $$PGM))
           (QDELETE (TUPLE $RELN $B $A))
           BACKTRACK))

(SIMPLEGOAL
  [QLAMBDA ←ANYTHING
           (QGOAL $ANYTHING APPLY $LITTLEGUYS)
           (COND
             (REQUIRE (QPUT $ANYTHING REQUIRED TRUE])

(SOLVE
  (QLAMBDA ←PROBLEM
           (QGOAL $PROBLEM APPLY $GOALTYPE)
           (QATTEMPT (QMATCHQ ←PGM
                              (PREVERSE $PGM)))
           (QMATCHQ ←PGM
                    (TUPLE (TUPLE COMMENT BEGINNING OF PROGRAM)
                           $$PGM
                           (TUPLE COMMENT END OF PROGRAM)))
           (PRINT $PGM)
           (PRINT (QUOTE "
  
     LISP CODE ONLY"))
           (PRINT (QUOTE "


"))
           (PURE $PGM)
           (TUPLE COMMENT END OF THIS REQUEST)))

(SETUP
  (QLAMBDA ←ANYTHING
           (DENYALL)
           (UNQTRACE PURE)
           (QASSERT (TUPLE RELN SUCC)
                    TYPE POSITIONAL EXTREME (TUPLE LAST ELEMENT)
                    NARGS 1 TARGS (TUPLE (TUPLE ANYELEMENT NOT LAST 
                                                ELEMENT))
                    NRES 1 TRES (TUPLE (TUPLE ANYELEMENT NOT
                                          FIRST ELEMENT)))
           (QASSERT (TUPLE RELN PRED)
                    TYPE POSITIONAL EXTREME (TUPLE FIRST ELEMENT)
                    NARGS 1 TARGS (TUPLE (TUPLE ANYELEMENT NOT
                                            FIRST ELEMENT))
                    NRES 1 TRES (TUPLE (TUPLE ANYELEMENT NOT LAST 
                                              ELEMENT)))
           (QASSERT (TUPLE RELN ENCLOSE)
                    TYPE ORDERING EXTREME
                    (TUPLE SINGLETON LIST OF THE FIRST ELEMENT)
                    NARGS 1 TARGS (TUPLE (TUPLE ANYELEMENT NOT))
                    NRES 1 TRES (TUPLE (TUPLE ANYLIST NOT ATOM)))
           (QASSERT (TUPLE RELN NUMERORDER)
                    TYPE ORDERING EXTREME (TUPLE SMALLEST ELEMENT)
                    NARGS 2 TARGS (TUPLE (TUPLE ANYELEMENT NOT)
                                         (TUPLE ANYELEMENT NOT))
                    NRES 1 TRES (TUPLE (TUPLE ANYELEMENT NOT)))
           (QASSERT (TUPLE RELN ALPHORDER)
                    TYPE ORDERING EXTREME (TUPLE CLOSEST ELEMENT
                                             TO A)
                    NARGS 2 TARGS (TUPLE (TUPLE ANYELEMENT NOT)
                                         (TUPLE ANYELEMENT NOT))
                    NRES 1 TRES (TUPLE (TUPLE ANYELEMENT NOT)))
           [QASSERT (TUPLE RELN MIN)
                    TYPE SELECT EXTREME (QUOTE LOWERBOUND)
                    DOMAIN
                    (TUPLE SETS OF ANYTYPE NUMBERS)
                    RANGE
                    (TUPLE ANYTYPE NUMBER)
                    KNOWN T FACTS
                    [TUPLE (TUPLE FORALL Z IN ?DOMAIN
                                              (TUPLE (TUPLE MIN ?DOMAIN)
                                                     LE Z))
                           (TUPLE (TUPLE TUPLE MIN Y SUCHTHAT ?GOAL)
                                  BECOMES
                                  [TUPLE TUPLE MAX Y SUCHTHAT
                                         (TUPLE REPLACE
                                                (TUPLE TUPLE Y
                                                       (TUPLE TUPLE 
                                                              ADD1 Y)
                                                       INEXPRESSION
                                                       (TUPLE NEGATION 
                                                              ?GOAL]
                              IF (TUPLE TUPLE MONOTONEIN
                                        (TUPLE TUPLE LIST
                                               (TUPLE TUPLE QUOTE ?GOAL)
                                               (TUPLE TUPLE QUOTE
                                                      (TUPLE TUPLE ADD1 
                                                             Y]
                    COMPUTABLE
                    (EVAL (TUPLE LOWERBOUND ?RANGE))
                    DEFINITION
                    (QUOTE ((START Y AT LOWERBOUND ?RANGE)
                            (RECURSE WITH Y AT (ADD1 Y]
           [QASSERT (TUPLE RELN MAX)
                    TYPE SELECT EXTREME (QUOTE UPPERBOUND)
                    DOMAIN
                    (TUPLE SETS OF ANYTYPE NUMBERS)
                    RANGE
                    (TUPLE ANYTYPE NUMBER)
                    KNOWN T FACTS
                    [TUPLE (TUPLE FORALL Z IN ?DOMAIN
                                              (TUPLE Z LE (TUPLE MAX 
                                                            ?DOMAIN)))
                           (TUPLE (TUPLE TUPLE MAX Y SUCHTHAT ?GOAL)
                                  BECOMES
                                  [TUPLE TUPLE MIN Y SUCHTHAT
                                         (TUPLE REPLACE
                                                (TUPLE TUPLE Y
                                                       (TUPLE TUPLE 
                                                              ADD1 Y)
                                                       INEXPRESSION
                                                       (TUPLE NEGATION 
                                                              ?GOAL]
                              IF (TUPLE TUPLE MONOTONEIN
                                        (TUPLE TUPLE LIST
                                               (TUPLE TUPLE QUOTE ?GOAL)
                                               (TUPLE TUPLE QUOTE
                                                      (TUPLE TUPLE SUB1 
                                                             Y]
                    COMPUTABLE
                    (EVAL (TUPLE UPPERBOUND ?RANGE))
                    DEFINITION
                    (QUOTE ((START Y AT UPPERBOUND ?RANGE)
                            (RECURSE WITH Y AT (TUPLE SUB1 Y]
           [QASSERT (TUPLE RELN SQUARE)
                    TYPE NUM EXTREME (QUOTE UPPERBOUND)
                    DOMAIN
                    (TUPLE THE REAL NUMBERS)
                    RANGE
                    (TUPLE THE NONNEGATIVE REAL NUMBERS)
                    MONOTONE T KNOWN T FACTS
                    (TUPLE (TUPLE INVERSE IS SQUAREROOT))
                    COMPUTABLE T DEFINITION
                    (QUOTE (TUPLE LAMBDA (TUPLE X)
                                  (TUPLE TIMES X X]
           (QASSERT (TUPLE RELN SQUAREROOT)
                    TYPE NUM EXTREME (QUOTE (TUPLE LAMBDA (TUPLE XX)
                                                   1))
                    DOMAIN
                    (TUPLE THE NONNEGATIVE REAL NUMBERS)
                    RANGE
                    (TUPLE THE NONNEGATIVE REAL NUMBERS)
                    KNOWN T FACTS (TUPLE (TUPLE INVERSE IS SQUARE))
                    COMPUTABLE NIL DEFINITION NIL)
           [QASSERT (TUPLE RELN GT)
                    TYPE PREDICATE NARGS 2 TARGS (TUPLE ANYNUMBER 
                                                        ANYNUMBER)
                    NRES 1 TRES (TUPLE (TUPLE LOGICAL))
                    NEGATION LE EXTREME (TUPLE UPPERBOUND)
                    MONOTONE T COMPUTABLE T DEFINITION
                    (QUOTE (TUPLE LAMBDA (TUPLE A B)
                                  (TUPLE A GT B]
           [QASSERT (TUPLE RELN LE)
                    TYPE PREDICATE NARGS 2 TARGS (TUPLE ANYNUMBER 
                                                        ANYNUMBER)
                    NRES 1 TRES (TUPLE (TUPLE LOGICAL))
                    NEGATION GT EXTREME (TUPLE LOWERBOUND)
                    MONOTONE T COMPUTABLE T DEFINITION
                    (QUOTE (TUPLE LAMBDA (TUPLE A B)
                                  (TUPLE A LE B]
           (QASSERT (TUPLE SCHEMA DOUBLEFN)
                    STANDARD T EXTREME (TUPLE SAMEASFN)
                    NARGS 1 TARGS
                    [TUPLE (TUPLE RELN NARGS 1 NRES 1
                                  (EQUAL (CADADR TARGS)
                                         (CADADR TRES]
                    NRES 1 TRES (TUPLE (TUPLE SAMEASFN NOT)))
           (QASSERT (TUPLE RELN CAR)
                    TYPE DESTRUCTIVE EXTREME (TUPLE LEFTMOST ATOM)
                    NARGS 1 TARGS (TUPLE (TUPLE ANYLIST NOT NIL))
                    NRES 1 TRES (TUPLE (TUPLE ANYELEMENT NOT)))
           (QASSERT (TUPLE RELN CDR)
                    TYPE DESTRUCTIVE EXTREME (TUPLE NIL)
                    NARGS 1 TARGS (TUPLE (TUPLE ANYLIST NOT NIL))
                    NRES 1 TRES (TUPLE (TUPLE ANYLIST NOT ATOM)))
           (QASSERT (TUPLE RELN CONS)
                    TYPE CONSTRUCTIVE EXTREME (TUPLE ANYLIST)
                    NARGS 2 TARGS (TUPLE (TUPLE ANYELEMENT NOT)
                                         (TUPLE ANYLIST NOT ATOM))
                    NRES 1 TRES (TUPLE (TUPLE ANYLIST NOT)))
           (QASSERT (TUPLE RELN APPEND)
                    TYPE CONSTRUCTIVE EXTREME (TUPLE ANYLIST)
                    NARGS 2 TARGS (TUPLE (TUPLE ANYLIST NOT ATOM)
                                         (TUPLE ANYLIST NOT ATOM))
                    NRES 1 TRES (TUPLE (TUPLE ANYLIST NOT)))
           (QASSERT (TUPLE C A A3))
           (QASSERT (TUPLE C B B3))
           (QASSERT (TUPLE C C C3))
           (QASSERT (TUPLE C D D3))
           (QASSERT (TUPLE C E E3))
           (QASSERT (TUPLE C F F3))
           (QASSERT (TUPLE C G G3))
           (QASSERT (TUPLE C I I3))
           (QASSERT (TUPLE C J J3))
           (QASSERT (TUPLE C K K3))
           (QASSERT (TUPLE C H H3))
           (QASSERT (TUPLE LIST L1 (TUPLE)))
           (QASSERT (TUPLE LIST L2 (TUPLE)))
           (QASSERT (TUPLE LIST L3 (TUPLE)))
           (QASSERT (TUPLE LIST L4 (TUPLE A B C)))
           (QASSERT (TUPLE LIST L5 (TUPLE D E)))
           (QASSERT (TUPLE LESS I J))
           (QASSERT (TUPLE LESS J K))
           (QASSERT (TUPLE LESS H I))
           (QPUT LESS ANTISYM T)
           (QPUT LESS PARTIAL T)
           (QPUT LESS TRANSITIVE T)
           (TUPLE SETUP COMPLETED)
           (QASSERT (TUPLE RELN ADD1)
                    COMPUTABLE T KNOWN T)
           (QASSERT (TUPLE RELN SUB1)
                    COMPUTABLE T KNOWN T)))

(INIT
  (QLAMBDA ←ANYTHING
           (QMATCHQ ←GOALTYPE
                    (TUPLE ORGOAL ANDGOAL XORGOAL SERIESGOAL NONEOF 
                           SIMPLEGOAL TRYANYTHINGANTISYMPARTIAL))
           (QMATCHQ ←LITTLEGUYS
                    (TUPLE SETQC RPLAC CONSC MAKENULL TRANSITIVECLOSURE 
                           REV2ELS RECURLIST RECURNUM))
           (QMATCHQ ←PGM
                    (TUPLE))
           (QMATCHQ ←UNUSEDVARS
                    (CLASS U1 U2 U3 U4 U5 U6 U7 U8 U9 U10 U11 U12 U13 
                           U14 U15 U16 U17))
           (QMATCHQ ←UNUSEDV
                    $UNUSEDVARS)
           (QMATCHQ ←SIMPLIFY
                    (TUPLE SIMPLIFYSETQ SIMPLIFYNUMERIC SIMPLIFYAUXFN 
                           SIMPLIFYNOTHING))
           (QMATCHQ ←UNUSEDLABELS
                    (CLASS LABEL1 LABEL2 LABEL3 LABEL4 LABEL5 LABEL6 
                           LABEL7 LABEL8 LABEL9 LABEL10))
           (QMATCHQ ←UNUSEDFNS
                    (CLASS F1 F2 F3 F4 F5 F6 F7 F8 F9 F10))
           (QMATCHQ ←UNUSEDARGS
                    (CLASS ARG1 ARG2 ARG3 ARG4 ARG5 ARG6 ARG7 ARG8 ARG9 
                           ARG10))
           $ANYTHING))

(GETNEWLOCNAME
  (QLAMBDA ←ANYTHING
           (QPROG (←X)
                  (QMATCHQ (CLASS ←X
                                  ←←UNUSEDVARS)
                           $UNUSEDVARS)
                  (QRETURN $X))))

(DENYALL
  [QLAMBDA ←ANYTHING
           (QATTEMPT (QDELETE (TUPLE C ←C1
                                     ←V1)))
           [QATTEMPT (QDELETE (TUPLE LIST ←L1
                                     (TUPLE ←←V1]
           (QATTEMPT (QDELETE (TUPLE LESS ←C1
                                     ←V1])

(SERIESGOAL
  (QLAMBDA (TUPLE SERIES ←Z1
                  ←←Z2)
           (SETQ NEED NIL)
           (SETQ REQUIRE NIL)
           (QGOAL $Z1 APPLY $GOALTYPE)
           (QIF (QEQUAL $Z2 (TUPLE))
               THEN $PGM
             ELSE (QGOAL (TUPLE SERIES $$Z2)
                         APPLY $GOALTYPE))))

(ORGOAL
  (QLAMBDA (CLASS OR ←Z1
                     ←←Z2)
           (QATTEMPT (QGOAL $Z1 APPLY $GOALTYPE)
               THEN (QMATCHQ ←PGM
                             (TUPLE (TUPLE COMMENT
                                       FROM THE ORTASK WE JUST DID $Z1)
                                    $$PGM))
             ELSE (QGOAL (CLASS OR $$Z2)
                         APPLY $GOALTYPE))))

(ANDGOAL
  [QLAMBDA (CLASS AND ←←Z)
           (QPROG (←Z1
                    ←Z2
                    ←Z3)
                  (QMATCHQ ←Z3
                           (CLASS))
                  (QMATCHQ (CLASS ←Z1
                                  ←←Z2)
                           $Z)
                  (GO B2)
                  B1
                  (QMATCHQ (CLASS ←Z1
                                  ←←Z2)
                           $Z)
                  (QMATCHQ ←Z3
                           (CLASS $$Z3 $Z1))
                  (QMATCHQ ←Z
                           (CLASS $$Z2))
                  B2
                  (SETQ NEED T)
                  (SETQ REQUIRE T)
                  (QATTEMPT (QGOAL $Z1 APPLY $GOALTYPE)
                      THEN (QIF (QEQUAL $Z2 (CLASS))
                               THEN (QIF (QEQUAL $Z3 (CLASS))
                                        THEN $PGM
                                      ELSE (QGOAL (CLASS AND $$Z3)
                                                  APPLY $GOALTYPE))
                             ELSE (QGOAL (CLASS AND $$Z2)
                                         APPLY $GOALTYPE))
                    ELSE (GO B1])

(XORGOAL
  (QLAMBDA (CLASS XOR ←Z1
                  ←←Z2)
           (QATTEMPT (QGOAL $Z1 APPLY $GOALTYPE)
               THEN (QATTEMPT (QGOAL (CLASS NONEOF $$Z2)
                                     APPLY $GOALTYPE)
                        THEN (QMATCHQ ←PGM
                                      (TUPLE (TUPLE COMMENT OF THE 
                                                    EXCLUSIVE
                                                      OR GOAL WE DID 
                                                         $Z1
                                                      AND NO OTHERS ARE 
                                                          SATISFIED)
                                             $$PGM)))
             ELSE (QGOAL (CLASS XOR $$Z2)
                         APPLY $GOALTYPE))))

(BUILDPGM
  [QLAMBDA (TUPLE ←NEWLOC
                  ←NEWVAL
                  ←OLDLOC)
           (QMATCHQ ←PGM
                    (TUPLE (TUPLE COMMENT I JUST TRANSFERRED THE VALUE 
                                  $NEWVAL
                              FROM CELL $OLDLOC
                              TO CELL $NEWLOC)
                           (TUPLE SETQ $NEWLOC $OLDLOC)
                           $$PGM))
           (QATTEMPT (QEXISTS (TUPLE C $NEWLOC ←OV))
               THEN (QMATCHQ ←PGM
                             (TUPLE (TUPLE COMMENT $NEWLOC NO LONGER 
                                           HAS THE VALUE $OV)
                                    $$PGM])

(GOBYEXAMPLE
  (QLAMBDA ←BODY
           (SETQ EX (GETEXAMPLE))
           (SETQ BOD (NEWCARCDR $BODY))
           (ERRORSET (EXECUTE BOD))
           (SETQ XX (CONS (QUOTE TUPLE)
                          EX))
           (QMATCHQ ←X
                    (EVAL XX))
           (ASKABOUTALL (CLASS $X))))

(GETEXAMPLE
  [LAMBDA NIL
    (QUOTE (A B C])

(SAMEASFN
  [LAMBDA (A)
    A])

(DOUBLEFN
  (QLAMBDA (TUPLE ←OLDARG
                  ←REL)
           (TUPLE $REL (TUPLE $REL $$OLDARG))))

(SYNTH1
  (QLAMBDA ←A
           (SELECTQ (CAR $A)
                    (NIL (TUPLE NULL $L))
                    (ATOM (TUPLE ATOM $L))
                    (FIRST (TUPLE NULL (TUPLE CDR $L)))
                    (LAST (TUPLE NULL (TUPLE CDR $L)))
                    (TUPLE EQUAL $L $$A))))

(SYNTH2
  (QLAMBDA (TUPLE ←A
                  ←B)
           (COND
             ((NULL (CAR $B))
               $B)
             ((EQUAL (CAR $B)
                     T)
               $B)
             ((NUMBERP (CAR $B))
               $B)
             ((EQUAL $A $B)
               (TUPLE $L))
             ((EQUAL (LIST $A)
                     $B)
               (TUPLE LIST $L))
             ((EQUAL (CAR $B)
                     (QUOTE FIRST))
               (TUPLE (TUPLE CAR $L)))
             (T (PRINT (QUOTE (I AM UNSURE ABOUT THE SYNTHESIS OF $B)))
                $B))))

(ASKABOUT
  [QLAMBDA
    ←A
    (SELECTQ
      (LENGTH $A)
      (0 (PRINT (QUOTE (APPARENTLY NO FURTHER BASE STEP IS NEEDED
                          FOR SYNTACTIC REASONS)))
         (IF (AND (QIN $NAME $BODY)
                  (NULL ONESTEP))
             THEN (QAND (PRINT (QUOTE (BUT $NAME APPEARS
                                         IN THE BODY OF THE DESIRED 
                                            FUNCTION $NAME)))
                        (PRINT (QUOTE (THUS I GIVE UP)))
                        (QFAIL)))
         [IF (NULL ONESTEP)
             THEN (PRINT (QUOTE (IT APPEARS THAT THE DEFINITION IS NOT 
                                    TRULY RECURSIVE
                                      AND THUS I SHALL PROCEED]
         $BODY)
      (AND (PRINT (TUPLE
                     IF THE INPUT IS $A
                        THEN WHAT IS THE OUTPUT??))
           (SETQ ONESTEP T)
           (QMATCHQ ←TERM
                    (TUPLE [QCONS (SYNTH1 $A)
                                  (SYNTH2
                                    (TUPLE $A (TUPLE (CONS (RATOM)
                                                           (READLINE]
                           $$TERM])

(RHMATCH
  (QLAMBDA (TUPLE ←←A
                  (TUPLE ←←B
                         NOT ←←C)←←D)
           (TUPLE $A $B $C $D)
           BACKTRACK))

(RECHEAD
  [QLAMBDA ←BODY
           (QPROG (←A
                    ←B
                    ←C
                    ←D
                    ←F
                    ONESTEP ←TERM
                    ←FF
                    ←B2
                    ←IMP
                    ←REST)
                  (QMATCHQ (TUPLE ←IMP
                                  ←←REST)
                           $BODY)
                  (QMATCHQ ←FF
                           (CLASS))
                  (SETQ ONESTEP NIL)
                  (QMATCHQ ←TERM
                           (TUPLE))
                  (QMATCHQ ←B2
                           (QGET (TUPLE RELN $IMP)
                                 TARGS))
                  LOOP
                  (QATTEMPT (QMATCHQ (TUPLE ←A
                                            ←B
                                            ←C
                                            ←D)
                                     (RHMATCH $B2))
                      THEN (AND (COND
                                  ((EQUAL (LENGTH $A)
                                          0)
                                    (QMATCHQ (TUPLE (TUPLE ←A2
                                                           ←F
                                                           ←←A4)←←A5)
                                             $BODY))
                                  ((EQUAL (LENGTH $A)
                                          1)
                                    (QMATCHQ (TUPLE ←A1
                                                    (TUPLE ←A2
                                                           ←F
                                                           ←←A4)←←A5)
                                             $BODY))
                                  ((EQUAL (LENGTH $A)
                                          2)
                                    (QMATCHQ (TUPLE ←A1
                                                    ←A6
                                                    (TUPLE ←A2
                                                           ←F
                                                           ←←A4)←←A5)
                                             $BODY))
                                  (T (PRINT (QUOTE (LENGTH OF LIST NOT 
                                                           ZERO
                                                             OR ONE
                                                             OR TWO
                                                      AS EXPECTED)))
                                     (PRINT (CDR (TUPLE $A $F $BODY)))
                                     (QFAIL)))
                                (QMATCHQ ←FF
                                         (CLASS $C $$FF))
                                (QMATCHQ ←B2
                                         (TUPLE $$A $$D))
                                (GO LOOP))
                    ELSE (TUPLE DEFINEQ
                                (TUPLE $NAME
                                       (TUPLE LAMBDA (TUPLE $L)
                                              (QATTEMPT (ASKABOUTALL
                                                          $FF)
                                                  THEN $AALH
                                                ELSE (GOBYEXAMPLE
                                                       $BODY])

(EXTREMEPOSITION
  (QLAMBDA ←RELATION
           (QGET (TUPLE RELN $RELATION)
                 EXTREME)))

(EXTREMERELATIVEPOSITION
  [QLAMBDA (TUPLE ←REL
                  ←NEWARG
                  ←OLDARG)
           (QATTEMPT (QMATCHQ $NEWARG $OLDARG)
               THEN (EXTREMEPOSITION $REL)
             ELSE (AND (QMATCHQ ←TTEMP
                                (INVOLVES $NEWARG $OLDARG))
                       (QBEXISTS (TUPLE SCHEMA ←S)
                                 STANDARD $TTEMP
                           THEN (QMATCHQ (TUPLE $REL $$OLDARG)
                                         ($S (TUPLE $NEWARG $REL)))
                                (APPLY* (CAR (QGET (TUPLE SCHEMA $S)
                                                   EXTREME))
                                        (EXTREMEPOSITION $REL])

(POSITIONALJOIN
  [QLAMBDA (TUPLE ←E2
                  ←ABE2
                  ←E1)
           (QMATCHQ ←E2T
                    (LISPTRANSLATE $E2))
           (QMATCHQ ←ABE2T
                    (LISPTRANSLATE $ABE2))
           (QATTEMPT (QMATCHQ $E1 (TUPLE FIRST ELEMENT))
               THEN (TUPLE CONS $E2T (TUPLE $NAME $ABE2T))
             ELSE (QATTEMPT (QMATCHQ $E1 (TUPLE LAST ELEMENT))
                      THEN (TUPLE APPEND (TUPLE $NAME $ABE2T)
                                  (TUPLE LIST $E2T))
                    ELSE (EVAL (PRINT (QUOTE (QFAIL])

(POSITIONAL
  (QLAMBDA ←L
           (QMATCHQ ←S
                    (TUPLE IDENTITY))
           (QMATCHQ ←E1
                    (EXTREMEPOSITION $RELNN))
           (QMATCHQ ←E2
                    (EXTREMERELATIVEPOSITION (TUPLE $RELNO $ARGSN 
                                                    $ARGSO)))
           (QMATCHQ ←PGM
                    (TUPLE (PRINT (TUPLE COMMENT
                                     IN PARTICULAR THE $$E1 OF THE NEW 
                                        LIST IS THE $$E2 OF THE
                                     OLD LIST $L))
                           $$PGM))
           (QMATCHQ ←RECBODY
                    (POSITIONALJOIN (TUPLE $E2 (ALLBUT $E2)
                                           $E1)))
           (PRINT (QUOTE (THIS ENABLED US TO GET THE RECURSIVE BODY)))
           (PRINT $RECBODY)
           (PRINT (QUOTE (WE NOW DETERMINE THE TERMINATION STEPS)))
           (QMATCHQ ←NEWFUNC
                    (RECHEAD $RECBODY))
           (EVAL (PRINT $NEWFUNC))
           (QMATCHQ ←PGM
                    (TUPLE $NEWFUNC $$PGM))))

(RECURLIST
  [QLAMBDA
    (TUPLE LIST ←L)
    (QMATCHQ (CLASS ←NAME
                    ←←UNUSEDFNS)
             $UNUSEDFNS)
    (QMATCHQ ←PGM
             (TUPLE (TUPLE COMMENT I AM ABOUT
                       TO CONSTRUCT A POSSIBLY RECURSIVE NEW FUNCTION 
                          WHICH I CHOOSE
                       TO CALL $NAME AND WHICH WILL TRANSFORM LISTS)
                    $$PGM))
    (PRINT (TUPLE I AM ABOUT TO CONSTRUCT A POSSIBLY RECURSIVE FUNCTION
              TO TRANSFORM LISTS))
    (PRINT (TUPLE THE NAME I CHOOSE FOR THIS FUNCTION IS $NAME))
    (PRINT (TUPLE THUS I NEED MORE INFORMATION ABOUT THE
              OLD VERSUS THE NEW STRUCTURE OF LIST $L))
    (PRIN1 (QUOTE "OLD.... "))
    (/SETQ OLDLIST (CONS (RATOM)
                         (READLINE)))
    (SETQ TEMPO (CONS (QUOTE TUPLE)
                      OLDLIST))
    (QMATCHQ (TUPLE ←RELNO
                    ←←ARGSO)
             (EVAL TEMPO))
    (PRIN1 (QUOTE "NEW.... "))
    (/SETQ NEWLIST (CONS (RATOM)
                         (READLINE)))
    (SETQ TEMPO (CONS (QUOTE TUPLE)
                      NEWLIST))
    (QMATCHQ (TUPLE ←RELNN
                    ←←ARGSN)
             (EVAL TEMPO))
    (QMATCHQ ←RELNTYPE
             (QGET (TUPLE RELN $RELNN)
                   TYPE))
    (QATTEMPT (OR (QMATCHQ $ARGSO (TUPLE))
                  (QMATCHQ $RELNTYPE (QGET (TUPLE RELN $RELNO)
                                           TYPE)))
        THEN (QAND (QMATCHQ ←PGM
                            (TUPLE (PRINT (TUPLE COMMENT WE KNOW THAT 
                                                 THE INITIAL
                                             TO FINAL TRANSFORMATION 
                                                INVOLVES SOLELY 
                                                $RELNTYPE CHANGES))
                                   $$PGM))
                   ($RELNTYPE $L)
                   (QMATCHQ ←PGM
                            (TUPLE (TUPLE $NAME $L)
                                   (TUPLE COMMENT WE APPLY OUR NEW 
                                          FUNCTION $NAME
                                      TO OUR GIVEN ARBITRARY LIST $L)
                                   $$PGM)))
      ELSE (QAND (QMATCHQ ←PGM
                          (TUPLE (PRINT (TUPLE COMMENT WE KNOW THAT THE 
                                               INITIAL
                                           TO FINAL CHANGE INVOLVES A 
                                              MIXTURE OF BOTH $RELNTYPE
                                                AND
                                                 (QGET (TUPLE RELN 
                                                             $RELNO)
                                                       TYPE)
                                                 CHANGES))
                                 $$PGM])

(MAKECOMPUTABLE
  [QLAMBDA (TUPLE ←←L1)
           (QPROG (←A1)
                  (QMATCHQ ←L2
                           $L1)
                  MCLOOP
                  (QATTEMPT (QMATCHQ (TUPLE ←A1
                                            ←←L2)
                                     $L2)
                      THEN (IF [OR (EQUAL $A1 $X)
                                   (EQUAL $A1 (QUOTE Y))
                                   (EQUAL T (QGET (TUPLE RELN $A1)
                                                  COMPUTABLE))
                                   (QMATCHQ ←L1
                                            (MODIFYUSINGFACTS
                                              (TUPLE $L1 $A1]
                               THEN (GO MCLOOP)
                             ELSE (RETURN (QFAIL)))
                    ELSE (RETURN $L1])

(MODIFYUSINGFACTS
  [QLAMBDA (TUPLE ←L1
                  ←A1)
           (QPROG (←RNAME
                    ←RARGS
                    ←F
                    ←ANY1
                    ←ANY2)
                  (QMATCHQ (TUPLE ←RNAME
                                  ←←RARGS)
                           $A1)
                  [QATTEMPT (COND
                              ((AND (EVAL (QGET (TUPLE RELN $RNAME)
                                                COMPUTABLE))
                                    (QMATCHQ (TUPLE ←WW)
                                             $RARGS)
                                    (MAKECOMPUTABLE $WW))
                                (RETURN $L1]
                  (QMATCHQ ←F
                           (QGET (TUPLE RELN $RNAME)
                                 FACTS))
                  (QATTEMPT (QMATCHQ (TUPLE ←←ANY1
                                            (TUPLE INVERSE IS ←INVFN)
                                            ←←ANY2)
                                     ?F)
                      THEN (INVERSESUBST $L1])

(INVERSESUBST
  [QLAMBDA ←L
           (QPROG (←REST)
                  (COND
                    ((NULL $L)
                      (RETURN NIL)))
                  (QMATCHQ (TUPLE ←SEC
                                  ←←REST)
                           $L)
                  [QMATCHQ ←SEC
                           (COND
                             ((EQUAL $SEC (QUOTE Y))
                               (TUPLE $INVFN Y))
                             ((EQUAL $SEC $A1)
                               (CADR $A1))
                             ((ATOM $SEC)
                               $SEC)
                             (T (CONS (INVERSESUBST (CAR $SEC))
                                      (INVERSESUBST (CDR $SEC]
                  (RETURN (CONS $SEC (INVERSESUBST $REST])

(IMPLEMENT
  [QLAMBDA
    ←DEF
    (QATTEMPT (QMATCHQ (TUPLE QUOTE ←DEF)
                       $DEF)
        THEN (PRINT (TUPLE
                       IN IMPLEMENT DEF IS $DEF AFTER STRIPPING QUOTE 
                          OFF))
      ELSE (PRINT (TUPLE
                     IN IMPLEMENT DEF IF $DEF AND IS NOT QUOTED)))
    (PRINT (TUPLE THE DESCRIPTION WE FINALLY TRY
              TO IMPLEMENT IS $DESC USING THE ALGORITHM $DEF))
    (QPROG
      NIL
      [QATTEMPT (QMATCHQ (TUPLE ←DEF1
                                ←←DEF2)
                         $DEF)
          THEN (PRINT (TUPLE WE MATCH $DEF INTO THE TWO PIECES $DEF1
                               AND $$DEF2))
        ELSE (RETURN (QMATCHQ ←PGM
                              (TUPLE (TUPLE COMMENT WE JUST APPLIED OUR 
                                            NEW FUNCTION $NAME
                                        TO ITS ORIGINAL INTENDED 
                                           ARGUMENT $ARG)
                                     (TUPLE $NAME $ARG)
                                     $$PGM]
      (QATTEMPT (QMATCHQ (TUPLE START ←VAR
                                AT ←←INITIALVAL)
                         $DEF1)
          THEN (AND (QMATCHQ (CLASS ←F
                                    ←←UNUSEDFNS)
                             $UNUSEDFNS)
                    (QASSERT (TUPLE RELN $F)
                             AUXFN T)
                    (QMATCHQ (TUPLE ←INITIALFN
                                    ←INITIALARG)
                             $INITIALVAL)
                    [QMATCHQ ←NEWFN
                             (TUPLE DEFINEQ
                                    (TUPLE $NAME
                                           (TUPLE LAMBDA (TUPLE $X)
                                                  (TUPLE SETQ $VAR
                                                         ($INITIALFN
                                                           $INITIALARG))
                                                  (TUPLE $F $X $VAR]
                    (QMATCHQ ←PGM
                             (TUPLE $NEWFN
                                    (TUPLE COMMENT WE WILL DEFINE $NAME 
                                           USING AN AUXILLIARY FUNCTION 
                                           OF TWO VARIABLES
                                           (TUPLE THE ORIGINAL ARGUMENT
                                                    AND A COUNTER))
                                    $$PGM))
                    (EVAL $NEWFN)
                    (IMPLEMENT2 (TUPLE $$DEF2 $F $X $VAR))
                    (RETURN (IMPLEMENT (TUPLE])

(IMPLEMENT2
  (QLAMBDA
    (TUPLE ←DEF
           ←NAME
           ←X
           ←VAR)
    (QMATCHQ ←NEWFNBOD
             $GOAL)
    (QATTEMPT
      (QMATCHQ (TUPLE RECURSE WITH $VAR AT ←EXPR)
               $DEF)
        THEN
         [QPROG NIL
                (QMATCHQ
                  ←NEWFN
                  (TUPLE DEFINEQ
                         (TUPLE $NAME
                                (TUPLE LAMBDA (TUPLE $X $VAR)
                                       (TUPLE COND (TUPLE $NEWFNBOD 
                                                          $VAR)
                                              (TUPLE T
                                                     (TUPLE $NAME $X 
                                                            $EXPR]
      ELSE
       (QATTEMPT
         (QMATCHQ (TUPLE RECURSE WITH $X AT $EXPR)
                  $DEF)
           THEN
            [QPROG
              NIL
              (QMATCHQ ←NEWFN
                       (TUPLE DEFINEQ
                              (TUPLE $NAME
                                     (TUPLE LAMBDA (TUPLE $X $VAR)
                                            (TUPLE COND (TUPLE 
                                                          $NEWFNBOD 
                                                               $VAR)
                                                   (TUPLE T
                                                          (TUPLE $NAME 
                                                              $EXPR 
                                                               $VAR]
         ELSE (QFAIL)))
    (EVAL $NEWFN)
    (QMATCHQ ←PGM
             (TUPLE $NEWFN
                    (TUPLE COMMENT WE DEFINE THE RECURSIVE FUNCTION 
                           $NAME
                       AS FOLLOWS)
                    $$PGM))))

(LOWERBOUND
  (QLAMBDA ←SET
           (COND
             ((FINITE $SET)
               (EXTREMORD (TUPLE $SET OPPOSITENUMORDER)))
             ((QATTEMPT (QMATCHQ (TUPLE THE POSITIVE ←←ANY)
                                 $SET))
               1)
             ((QATTEMPT (QMATCHQ (TUPLE THE NONNEGATIVE ←←ANY)
                                 $SET))
               0)
             ((QATTEMPT (QMATCHQ (TUPLE THE NATURAL NUMBERS)
                                 $SET))
               0)
             ((REASONTOGET (TUPLE LOWERBOUND)))
             (T NIL))))

(OPPOSITENUMORDER
  [LAMBDA (A B)
    (ALPHORDER B A])

(HOLDS
  (QLAMBDA ←CONDITION
           (QMATCHQ (TUPLE ←FNH
                           ←ARGH)
                    $CONDITION)
           (SETQ ARGHH (EVAL $ARGH))
           ($FNH (EVAL ARGHH))))

(OBTAINRECURARGS
  [QLAMBDA (TUPLE ←NAME
                  ←INS)
           (QPROG (←I1
                    ←I2)
                  (QATTEMPT (QMATCHQ (TUPLE $NAME ←←RARGS)
                                     $INS)
                      THEN $RARGS
                    ELSE (QATTEMPT (QMATCHQ (TUPLE ←I1
                                                   ←←I2)
                                            $INS)
                             THEN (OR (OBTAINRECURARGS (TUPLE $NAME $I1)
                                                       )
                                      (OBTAINRECURARGS (TUPLE $NAME $I2)
                                                       ))
                           ELSE (QMATCHQ ←RARGS
                                         (TUPLE])

(NOTTOORECURSIVE
  (QLAMBDA ←RECURARG
           (IF (EQUAL $RECURARG (QATTEMPT (MAKECOMPUTABLE $RECURARG)))
               THEN T
             ELSE (QATTEMPT (QMATCHQ (TUPLE ←R1
                                            ←←R2)
                                     $RECURARG)
                      THEN (AND (OR (AND $R2 (NOTTOORECURSIVE
                                           (TUPLE $R1)))
                                    (NOTTOORECURSIVE $R1))
                                (NOTTOORECURSIVE $R2))
                    ELSE NIL))))

(SIMPLIFYNOTHING
  (QLAMBDA (TUPLE SIMPLE ←←ANYTHING)
           $ANYTHING))

(INCTEST
  (QLAMBDA (TUPLE ←FN1
                  ←COMPAR)
           (QMATCHQ (TUPLE ←←B1
                           (TUPLE DEFINEQ (TUPLE $FN1
                                                 (TUPLE ←LAMB1
                                                        ←ARGS1
                                                        ←←INSTRUCS1)))
                           ←←B2)
                    $COMPAR)))

(INVESTIGATE
  (QLAMBDA ←V
           (IF (ZEROP (LENGTH $V))
               THEN (QGOAL (TUPLE SIMPLE $V)
                           APPLY $SIMPLIFY)
             ELSE (QGOAL (TUPLE SIMPLE $$V)
                         APPLY $SIMPLIFY))))

(SIMPLIFYSETQ
  (QLAMBDA (TUPLE SIMPLE SETQ ←CELL
                  ←VALUE)
           (TUPLE SETQ $CELL (INVESTIGATE $VALUE))))

(SIMPLIFYNUMERIC
  [QLAMBDA (TUPLE SIMPLE ←NUM)
           (COND
             ((NUMBERP $NUM)
               $NUM)
             ((ZEROP (LENGTH $NUM))
               (PRINT (TUPLE NO $NUM IS AN ATOM ALL RIGHT BUT NOT A 
                             NUMBER))
               (QFAIL))
             (T (QFAIL])

(SIMPLIFYAUXFN
  [QLAMBDA (TUPLE SIMPLE ←FN
                  ←←ARGS)
           (COND
             ((EQUAL T (QGET (TUPLE RELN $FN)
                             AUXFN)))
             (T (QFAIL)))
           (PUSHVARS)
           (QMATCHQ ←NEWA1
                    (QATTEMPT (OPTIMIZE (TUPLE $FN $A1))
                      ELSE ?HOLDA1))
           (QMATCHQ ←NEWA2
                    (QATTEMPT (OPTIMIZE (TUPLE $FN ?HOLDA2))
                      ELSE ?HOLDA2))
           (POPVARS)
           (QMATCHQ ←A1
                    $NEWA1)
           (QMATCHQ ←A2
                    $NEWA2)
           (QATTEMPT (TRYTOINCORPORATE (TUPLE $FN INTO $NAME])

(TRYTOINCORPORATE
  (QLAMBDA (TUPLE ←FN1
                  INTO ←FN2)
           (INCTEST (TUPLE $FN1 (TUPLE $$A1 $$A2)))
           (IF (MEMBER $FN1 (FLATTEN $INSTRUCS1))
               THEN (AND (PRINT (TUPLE $FN1 HAS THE RECURSIVE BODY 
                                       $INSTRUCS1))
                         (QFAIL)))
           (QATTEMPT (INCTEST (TUPLE $FN1 $A1))
               THEN (QMATCHQ ←A1
                             (TUPLE $$B1 $$B2))
             ELSE (IF (INCTEST (TUPLE $FN1 $A2))
                      THEN (QMATCHQ ←A2
                                    (TUPLE $$B1 $$B2))
                    ELSE (QFAIL)))
           (QMATCHQ (TUPLE ←←AX1
                           (TUPLE $FN1 ←←FN1ARGS)←←AX2)
                    $INSTRUCS)
           (QMATCHQ ←INSTRUCS
                    (TUPLE $$AX1 $$INSTRUCS1 $$AX2))))

(OPTIMIZE
  (QLAMBDA (TUPLE ←NAMEO
                  (TUPLE ←←A1O
                         (TUPLE DEFINEQ (TUPLE ←NAMEO
                                               (TUPLE ←LAMB
                                                      ←ARGS
                                                      ←←INSTRUCSO)))
                         ←←A2O))
           (QMATCHQ ←A1
                    $A1O)
           (QMATCHQ ←NAME
                    $NAMEO)
           (QMATCHQ ←INSTRUCS
                    $INSTRUCSO)
           (QMATCHQ ←A2
                    $A2O)
           (SETQ ELS (FLATTEN $INSTRUCS))
           (IF (MEMBER $NAME ELS)
               THEN (TRYTOELIMRECURSION)
             ELSE (PRINT (TUPLE $NAME IS NOT RECURSIVE AS CURRENTLY 
                                                          DEFINED)))
           (SETQ INSTRU $INSTRUCS)
           [FOR VVVV IN INSTRU
              DO (IF (MEMBER (CAR VVVV)
                             (TUPLE DEFINEQ LAMBDA (TUPLE)
                                    QLAMBDA $ARG $X Y))
                   ELSE (COND
                          (VVVV (AND (QMATCHQ ←VV
                                              (INTUPLE VVVV))
                                     (INVESTIGATE $VV)))
                          (T T]
           (TUPLE $$A1 (TUPLE DEFINEQ (TUPLE $NAME
                                             (TUPLE $LAMB $ARGS 
                                                    $$INSTRUCS)))
                  $$A2)))

(TRYTOELIMRECURSION
  [QLAMBDA ←ANYTHING
           (SETQ MULT 0)
           [FOR W IN ELS DO (IF (EQUAL W $NAME)
                                THEN (SETQ MULT (ADD1 MULT]
           (PRINT (TUPLE MULTIPLICITY OF SELF RECURSION OF $NAME IS
                         (EVAL MULT)))
           (SELECTQ MULT
                    (0 (PRINT (TUPLE $NAME NO LONGER RECURSIVE)))
                    [1 (SETQ R (OBTAINRECURARGS (TUPLE $NAME $INSTRUCS))
                         )
                       (QATTEMPT [FOR RA IN R
                                    DO (NOTTOORECURSIVE
                                         (TUPLE (EVAL RA]
                           THEN (REARRANGE $NAME)
                         ELSE (PRINT (TUPLE ARGS OF $NAME
                                        IN RECURSIVE CALL ARE JUST TOO 
                                           INHERENTLY RECURSIVE 
                                           THEMSELVES
                                        TO ALLOW US
                                        TO SIMPLY REARRANGE $INSTRUCS]
                    (PRINT (TUPLE $NAME CALLS ITSELF TOO MANY TIMES
                              IN ITS DEFINITION SO I GIVE UP])

(REARRANGE
  [QLAMBDA
    ←NAME
    (QMATCHQ (CLASS ←LABEL
                    ←←UNUSEDLABELS)
             $UNUSEDLABELS)
    (SETQ INS NIL)
    (FOR
      II IN $INSTRUCS
       DO
        (SETQ INS
          (APPEND
            [QATTEMPT
              (QMATCHQ (TUPLE $NAME ←←RARGS)
                       II)
                THEN
                 [QPROG
                   NIL
                   (SETQ JCOL NIL)
                   (FOR
                     JJ IN $RARGS
                      DO
                       (SETQ JCOL
                         (APPEND
                           (IF
                             (ATOM JJ)
                               THEN NIL
                             ELSE
                              (QATTEMPT
                                (QMATCHQ (TUPLE ←JFN
                                                ←JARG)
                                         JJ)
                                  THEN (TUPLE SETQ $JARG (EVAL JJ))
                                ELSE (AND (PRINT (TUPLE COMMENT 
                                                        REARRANGE 
                                                        UNSURE ABOUT
                                                        (EVAL JJ)))
                                          JJ)))
                           JCOL)))
                   (RETURN (TUPLE AND (EVAL JCOL)
                                      (TUPLE GO $LABEL]
              ELSE (IF (ATOM II)
                       THEN II
                     ELSE (REARRANGE2 (QMATCHQ ←III
                                               II]
            INS)))
    (QMATCHQ ←INSTRUCS
             (TUPLE (TUPLE QPROG (TUPLE)
                           $LABEL
                           (EVAL INS])

(REARRANGE2
  (QLAMBDA
    ←L
    (QPROG
      (←LA
        ←LB
        JCOL ←CAR
        ←CDR)
      (QATTEMPT
        (QMATCHQ (TUPLE ←LA
                        ←←LB)
                 $L)
          THEN
           (CONS
             [QATTEMPT
               (QMATCHQ (TUPLE $NAME ←←RARGS)
                        $LA)
                 THEN
                  (QPROG
                    NIL
                    (SETQ JCOL NIL)
                    (FOR
                      JJ IN $RARGS
                       DO
                        (SETQ JCOL
                          (APPEND
                            (IF
                              (ATOM JJ)
                                THEN NIL
                              ELSE
                               (QATTEMPT
                                 (QMATCHQ (TUPLE ←JFN
                                                 ←JARG)
                                          JJ)
                                   THEN (TUPLE SETQ $JARG (EVAL JJ))
                                 ELSE
                                  (AND (PRINT (TUPLE COMMENT REARRANGE2 
                                                     UNSURE ABOUT
                                                     (EVAL JJ)))
                                       JJ)))
                            JCOL)))
                    (QMATCHQ ←RR1
                             JCOL)
                    (QMATCHQ ←RR2
                             (TUPLE GO $LABEL))
                    (QMATCHQ ←RR3
                             (LIST (QUOTE AND)
                                   $RR1 $RR2))
                    (RETURN $RR3))
               ELSE (IF (ZEROP (LENGTH $LA))
                        THEN $LA
                      ELSE (AND (QMATCHQ (TUPLE ←CAR
                                                ←←CDR)
                                         $LA)
                                (CONS (REARRANGE2 $CAR)
                                      (REARRANGE2 $CDR]
             (REARRANGE2 $LB))
        ELSE $L))))

(POPVARS
  (QLAMBDA ←ANYTHING
           (PRINT (TUPLE NAME ?NAME ?HOLDNAME A1 ?A1 ?HOLDA1 A2 ?A2 
                         ?HOLDA2 ARGS ?ARGS ?HOLDARGS INSTRUCS 
                         ?INSTRUCS))
           (QMATCHQ ←NAME
                    ?HOLDNAME)
           (QMATCHQ ←A1
                    ?HOLDA1)
           (QMATCHQ ←A2
                    ?HOLDA2)
           (QMATCHQ ←ARGS
                    ?HOLDARGS)
           (QMATCHQ ←INSTRUCS
                    ?HOLDI)))

(PUSHVARS
  (QLAMBDA ←ANYTHING
           (PRINT (TUPLE NAME ?NAME ?HOLDNAME A1 ?A1 ?HOLDA1 A2 ?A2 
                         ?HOLDA2 ARGS ?ARGS ?HOLDARGS HOLDINSTRUCS 
                         ?HOLDI))
           (QMATCHQ ←HOLDNAME
                    ?NAME)
           (QMATCHQ ←HOLDA1
                    ?A1)
           (QMATCHQ ←HOLDA2
                    ?A2)
           (QMATCHQ ←HOLDARGS
                    ?ARGS)
           (QMATCHQ ←HOLDI
                    ?INSTRUCS)))

(INTUPLE
  [LAMBDA (L)
    (COND
      ((NULL L)
        (QUOTE (TUPLE)))
      ((ATOM L)
        L)
      ((EQUAL L (QUOTE (NIL)))
        NIL)
      (T (CONS (QUOTE TUPLE)
               (FOR LL IN L COLLECT (INTUPLE LL])
)
  (LISPXPRINT (QUOTE PUPFNS)
              T)
  (RPAQQ PUPFNS
         (PURE RAMIFICATIONS OUTTUPLE EXECUTE LISPTRANSLATE REV2ELS 
               CELLEQUAL LISTEQUAL PULLOUT NUMERORDER EXTREMORD 
               ORDERING EXTREMEORDERING NEWCDR REASONTOGET FINITE 
               UPPERBOUND MONOTONEIN NEGATION PREVERSE SQUARE REPLACE 
               NOTENEWFORM RECURNUM NEWRECURNUM NEWCAR NEWCARCDR 
               ASKABOUTALL NONEOF INVOLVES FLATTEN INSIDEC SUBLISTC 
               APPENDC REPLACECDR REPLACECAR MAKENULL RPLAC NEWCELL 
               ALLBUT STORECVALUE CONSC SETQC TRANSITIVECLOSURE 
               TRYANYTHINGANTISYMPARTIAL SIMPLEGOAL SOLVE SETUP INIT 
               GETNEWLOCNAME DENYALL SERIESGOAL ORGOAL ANDGOAL XORGOAL 
               BUILDPGM GOBYEXAMPLE GETEXAMPLE SAMEASFN DOUBLEFN SYNTH1 
               SYNTH2 ASKABOUT RHMATCH RECHEAD EXTREMEPOSITION 
               EXTREMERELATIVEPOSITION POSITIONALJOIN POSITIONAL 
               RECURLIST MAKECOMPUTABLE MODIFYUSINGFACTS INVERSESUBST 
               IMPLEMENT IMPLEMENT2 LOWERBOUND OPPOSITENUMORDER HOLDS 
               OBTAINRECURARGS NOTTOORECURSIVE SIMPLIFYNOTHING INCTEST 
               INVESTIGATE SIMPLIFYSETQ SIMPLIFYNUMERIC SIMPLIFYAUXFN 
               TRYTOINCORPORATE OPTIMIZE TRYTOELIMRECURSION REARRANGE 
               REARRANGE2 POPVARS PUSHVARS INTUPLE))
  (LISPXPRINT (QUOTE PUPVARS)
              T)
  [RPAQQ PUPVARS (CGG CG NEED FACTS REQUIRE $PGM $UNUSEDARGS $UNUSEDFNS 
                      $UNUSEDVARS (P (QSETUP PUPVARS))
                      (P (SETUP)
                         (INIT)
                         (PRINT (QUOTE (READY TO BEGIN PUP]
  (RPAQQ CGG
         (QA4:PURE QA4:RAMIFICATIONS OUTTUPLE EXECUTE QA4:LISPTRANSLATE 
                   QA4:REV2ELS QA4:CELLEQUAL QA4:LISTEQUAL PULLOUT 
                   NUMERORDER QA4:EXTREMORD QA4:ORDERING 
                   QA4:EXTREMEORDERING NEWCDR NEWCAR NEWCARCDR 
                   QA4:ASKABOUTALL QA4:INVOLVES FLATTEN INSIDEC 
                   SUBLISTC QA4:APPENDC QA4:REPLACECDR QA4:REPLACECAR 
                   QA4:MAKENULL QA4:RPLAC QA4:NEWCELL QA4:ALLBUT 
                   QA4:STORECVALUE QA4:CONSC QA4:SETQC 
                   QA4:TRANSITIVECLOSURE QA4:TRYANYTHINGANTISYMPARTIAL 
                   QA4:SIMPLEGOAL QA4:SOLVE QA4:SETUP QA4:INIT 
                   QA4:GETNEWLOCNAME QA4:DENYALL QA4:SERIESGOAL 
                   QA4:ORGOAL QA4:ANDGOAL QA4:XORGOAL QA4:BUILDPGM 
                   QA4:GOBYEXAMPLE GETEXAMPLE SAMEASFN QA4:DOUBLEFN 
                   QA4:SYNTH1 QA4:SYNTH2 QA4:ASKABOUT QA4:RHMATCH 
                   QA4:RECHEAD QA4:EXTREMEPOSITION 
                   QA4:EXTREMERELATIVEPOSITION QA4:POSITIONALJOIN 
                   QA4:POSITIONAL QA4:RECURLIST))
  (RPAQQ CG
         (PURE RAMIFICATIONS OUTTUPLE EXECUTE LISPTRANSLATE REV2ELS 
               CELLEQUAL LISTEQUAL PULLOUT NUMERORDER EXTREMORD 
               ORDERING EXTREMEORDERING NEWCDR NEWCAR NEWCARCDR 
               ASKABOUTALL INVOLVES FLATTEN INSIDEC SUBLISTC APPENDC 
               REPLACECDR REPLACECAR MAKENULL RPLAC NEWCELL ALLBUT 
               STORECVALUE CONSC SETQC TRANSITIVECLOSURE 
               TRYANYTHINGANTISYMPARTIAL SIMPLEGOAL SOLVE SETUP INIT 
               GETNEWLOCNAME DENYALL SERIESGOAL ORGOAL ANDGOAL XORGOAL 
               BUILDPGM GOBYEXAMPLE GETEXAMPLE SAMEASFN DOUBLEFN SYNTH1 
               SYNTH2 ASKABOUT RHMATCH RECHEAD EXTREMEPOSITION 
               EXTREMERELATIVEPOSITION POSITIONALJOIN POSITIONAL 
               RECURLIST))
  (RPAQQ NEED NIL)
  (RPAQQ FACTS FACTS)
  (RPAQQ REQUIRE NIL)
  (RPAQQ $PGM NIL)
  (RPAQQ $UNUSEDARGS
         (CLASS ARG8 ARG9 ARG10 ARG1 ARG2 ARG3 ARG4 ARG5 ARG6 ARG7))
  (RPAQQ $UNUSEDFNS
         (CLASS F3 F4 F5 F6 F7 F8 F9 F10 F1 F2))
  (RPAQQ $UNUSEDVARS
         (CLASS U13 U15 U11 U16 U17 U1 U5 U6 U2 U3 U4 U8 U10 U7 U12 U9 
                U14))
  (QSETUP PUPVARS)
  (SETUP)
  (INIT)
  (PRINT (QUOTE (READY TO BEGIN PUP)))
STOP